﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar;

namespace ProductManagement.Ultilities
{
    /// <summary>
    /// Lớp kiểm tra tính hợp lệ của dữ liệu do người dùng nhập vào
    /// </summary>
    class Validator
    {           
        #region Methods

        /// <summary>
        /// Kiểm tra tính hợp lệ của tên sản phẩm
        /// </summary>
        /// <param name="ctrl">control chứa tên sản phẩm do người dùng nhập vào</param>
        /// <param name="errorProvider">control báo lỗi</param>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        public bool ValidateName(Control ctrl, ErrorProvider errorProvider)
        {
            if (ctrl.Text == "")
            {
                errorProvider.SetError(ctrl, "Tên sản phẩm không được để trống!");
                return false;
            }
            return true;
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của số lượng sản phẩm
        /// </summary>
        /// <param name="ctrl">control chứa số lượng sản phẩm do người dùng nhập vào</param>
        /// <param name="errorProvider">control báo lỗi</param>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        public bool ValidateQuantity(Control ctrl, ErrorProvider errorProvider)
        { 
            if (ctrl.Text == "")
            {
                errorProvider.SetError(ctrl, "Số lượng sản phẩm không được để trống!");
                return false;
            }
            try
            {
                int quantity = Int32.Parse(ctrl.Text);
                if (quantity < 0)
                {
                    errorProvider.SetError(ctrl, "Số lượng sản phẩm không được nhỏ hơn 0!");
                    return false;
                }
            }
            catch (FormatException)
            {
                errorProvider.SetError(ctrl, "Số lượng sản phẩm phải là số nguyên!");
                return false;
            }
            catch (ArgumentOutOfRangeException)
            {
                errorProvider.SetError(ctrl, "Số lượng sản phẩm quá lớn!");
                return false;
            }
            catch (Exception e)
            {
                MessageBoxEx.Show(e.ToString(), "Ngoại lệ", MessageBoxButtons.OK);
                return false;
            }
            return true;
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của giá thành sản phẩm
        /// </summary>
        /// <param name="ctrl">control chứa giá thành sản phẩm do người dùng nhập vào</param>
        /// <param name="errorProvider">control báo lỗi</param>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        public bool ValidatePrice(Control ctrl, ErrorProvider errorProvider)
        {
            if (ctrl.Text == "")
            {
                errorProvider.SetError(ctrl, "Giá sản phẩm không được để trống!");
                return false;
            }
            try
            {
                decimal price = Decimal.Parse(ctrl.Text);
                if (price < 0)
                {
                    errorProvider.SetError(ctrl, "Giá sản phẩm phải lớn hơn 0!");
                    return false;
                }
            }
            catch (FormatException)
            {
                errorProvider.SetError(ctrl, "Giá sản phẩm phải là số!");
                return false;
            }
            catch (ArgumentOutOfRangeException)
            {
                errorProvider.SetError(ctrl, "Giá sản phẩm quá lớn!");
                return false;
            }
            catch (Exception e)
            {
                MessageBoxEx.Show(e.ToString(), "Ngoại lệ", MessageBoxButtons.OK);
                return false;
            }
            return true;
        }

        /// <summary>
        /// Kiểm tra tính hợp lệ của năm sản xuất sản phẩm
        /// </summary>
        /// <param name="ctrl">control chứa năm sản xuất sản phẩm do người dùng nhập vào</param>
        /// <param name="errorProvider">control báo lỗi</param>
        /// <returns>true nếu hợp lệ, false nếu không hợp lệ</returns>
        public bool ValidateYear(Control ctrl, ErrorProvider errorProvider)
        {
            if (ctrl.Text == "")
            {
                errorProvider.SetError(ctrl, "Năm sản xuất không được để trống!");
                return false;
            }
            try
            {
                int year = Int32.Parse(ctrl.Text);
                if (year > DateTime.Now.Year)
                {
                    errorProvider.SetError(ctrl, "Năm sản xuất không được lớn hơn năm hiện tại!");
                    return false;
                }
                if (year < DateTime.Now.Year - 4)
                {
                    errorProvider.SetError(ctrl, "Chỉ nhận sản phẩm được sản xuất trong vòng 5 năm trở lại!");
                    return false;
                }
                if (year < 0)
                {
                    errorProvider.SetError(ctrl, "Năm sản xuất phải lớn hơn 0!");
                    return false;
                }
            }
            catch (FormatException)
            { 
                errorProvider.SetError(ctrl, "Năm sản xuất phải là số nguyên!");
                return false;
            }
            return true;
        }

        #endregion
    }
}
